package com.rain.rainspringboot3.encryption.service;


import com.rain.rainspringboot3.encryption.annotation.EncryptField;
import com.rain.rainspringboot3.encryption.entity.SensitiveData;

import java.util.Map;
import java.util.Set;

/**
 * 加密服务接口
 * 提供对象加密和解密功能
 */
public interface EncryptionService {
    /**
     * 加密对象
     * @param object 需要加密的对象
     * @param <T> 对象类型
     * @return 加密后的对象
     */
    <T> T encryptObject(T object);
    
    /**
     * 解密对象
     * @param object 需要解密的对象
     * @param <T> 对象类型
     * @return 解密后的对象
     */
    <T> T decryptObject(T object);
    
    /**
     * 加密单个字段
     * @param plainText 明文
     * @param encryptField 加密注解
     * @param contextObject 上下文对象
     * @param prefixAndSuffixMap 前缀和后缀
     * @return 敏感数据ID
     */
    Long encryptField(String plainText, EncryptField encryptField, Object contextObject, Map<String, String> prefixAndSuffixMap);
    
    /**
     * 解密单个字段
     * @param sensitiveDataId 敏感数据ID
     * @return 明文
     */
    String decryptField(Long sensitiveDataId,EncryptField encryptField);

    /**
     * 获取明文
     * @param sensitiveData 敏感数据
     * @return 明文
     */
    String getPlainText(SensitiveData sensitiveData);

    Map<Long, String> batchDecryptFields(Set<Long> sensitiveDataIds);
}